home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / TIMEDOS.C < prev    next >
C/C++ Source or Header  |  1994-05-27  |  4KB  |  133 lines

  1. /*****************************************************************************
  2.  * FILE: timedos.c                                                           *
  3.  *                                         *
  4.  * DESC:                                     *
  5.  *      - time from DOS to UNIX                                              *
  6.  *      - time from UNIX to DOS                                              *
  7.  *                                         *
  8.  * Copyright (C) 1993,1994                             *
  9.  *    Rainer Schnitker, Heeper Str. 283, 33607 Bielefeld             *
  10.  *    email: rainer@mathematik.uni-bielefeld.de                 *
  11.  *                                         *
  12.  *****************************************************************************/
  13.  
  14. #include <time.h>
  15. #include "TIMEDOS.H"
  16.  
  17. #define MINUTE 60L
  18. #define HOUR (60L*MINUTE)
  19. #define DAY (24L*HOUR)
  20. #define YEAR (365L*DAY)
  21.  
  22. static long month[12] =
  23. {
  24.     0L,
  25.     DAY * (long) (31),
  26.     DAY * (long) (31 + 29),
  27.     DAY * (long) (31 + 29 + 31),
  28.     DAY * (long) (31 + 29 + 31 + 30),
  29.     DAY * (long) (31 + 29 + 31 + 30 + 31),
  30.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30),
  31.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30 + 31),
  32.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31),
  33.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30),
  34.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31),
  35.     DAY * (long) (31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30)
  36. };
  37.  
  38. unsigned long dos2gmt(struct dos_date * dd, struct dos_time * dt)
  39. {
  40.     unsigned long res;
  41.     unsigned long year;
  42.  
  43.     /* calc date */
  44.     year = dd->ddate_year - 1970L;
  45.     res = YEAR * year + DAY * ((year + 1) / 4);
  46.     res += month[dd->ddate_month - 1];
  47.     if (dd->ddate_month > 2 && ((year + 2) % 4))
  48.     res -= DAY;
  49.     res += DAY * (dd->ddate_day - 1);
  50.  
  51.     /* calc time */
  52.     res += HOUR * (dt->dtime_hour);
  53.     res += MINUTE * (dt->dtime_minutes);
  54.     res += (dt->dtime_seconds);
  55.  
  56.     return res;
  57. }
  58.  
  59. #define leap(y) \
  60.   ((y) % 4 != 0 ? 0 : (y) % 100 != 0 ? 1 : (y) % 400 != 0 ? 0 : 1)
  61.  
  62. void gmt2tm(unsigned long *t, struct tm * result)
  63. {
  64.     static int const mon_len[12] =
  65.     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  66.     unsigned long t0, t1;
  67.     unsigned long q;
  68.  
  69.     t0 = *t;
  70.     if (t0 == (unsigned long) (-1))
  71.     return;
  72.  
  73.     result->tm_sec = (int) (t0 % 60L);
  74.     q = t0 / 60L;
  75.     t0 = q;
  76.     result->tm_min = (int) (t0 % 60L);
  77.     q = t0 / 60L;
  78.     t0 = q;
  79.     result->tm_hour = (int) (t0 % 24L);
  80.     q = t0 / 24L;
  81.     t0 = q;
  82.  
  83.     result->tm_wday = (int) ((t0 + 4) % 7);
  84.     result->tm_year = 70;
  85.     for (;;) {
  86.     t1 = (leap(result->tm_year + 1900) ? 366 : 365);
  87.     if (t1 > t0)
  88.         break;
  89.     t0 -= t1;
  90.     ++result->tm_year;
  91.     }
  92.     result->tm_mon = 0;
  93.     result->tm_yday = (int) t0;
  94.     for (;;) {
  95.     if (result->tm_mon == 1)
  96.         t1 = (leap(result->tm_year + 1900) ? 29 : 28);
  97.     else
  98.         t1 = mon_len[result->tm_mon];
  99.     if (t1 > t0)
  100.         break;
  101.     t0 -= t1;
  102.     ++result->tm_mon;
  103.     }
  104.     result->tm_mday = (int) t0 + 1;
  105.     result->tm_isdst = 0;
  106. }
  107.  
  108. unsigned long filetime2gmt(struct file_time * ft)
  109. {
  110.     struct dos_date dd;
  111.     struct dos_time dt;
  112.  
  113.     dd.ddate_year = (unsigned short) ((ft->ft_date >> 9) + 1980);
  114.     dd.ddate_month = (unsigned char) ((ft->ft_date >> 5) & 15);
  115.     dd.ddate_day = (unsigned char) (ft->ft_date & 31);
  116.  
  117.     dt.dtime_hour = (unsigned char) (ft->ft_time >> 11);
  118.     dt.dtime_minutes = (unsigned char) ((ft->ft_time >> 5) & 63);
  119.     dt.dtime_seconds = (unsigned char) ((ft->ft_time & 31) << 1);
  120.  
  121.     return dos2gmt(&dd, &dt);
  122. }
  123.  
  124. void gmt2filetime(unsigned long time, struct file_time * ft)
  125. {
  126.     struct tm tm;
  127.  
  128.     gmt2tm(&time, &tm);
  129.     ft->ft_date = tm.tm_mday + ((tm.tm_mon + 1) << 5) +
  130.     ((tm.tm_year - 80) << 9);
  131.     ft->ft_time = tm.tm_sec / 2 + (tm.tm_min << 5) + (tm.tm_hour << 11);
  132. }
  133.